
#include <utility>
// #include <rais_meta/list.hpp>
#include <rais_meta/bstree.hpp>
#include <rais_meta/lambda.hpp>
// #include <rais_meta/map.hpp>


using namespace rais::meta;

using tree0 = bstree<>;
using tree1 = typename tree0
	::template put<meta<5>, meta<43>, meta<13>, meta<9>, meta<-4>, meta<0> >;
	// template put<meta<5>>::
	// template put<meta<43>>::
	// template put<meta<13>>::
	// template put<meta<9>>::
	// template put<meta<-4>>::
	// template put<meta<0>>;


using f = lambda<types_pack, expr< op::push, param<1>, param<0> > >;
// using test = for_container<type_list<meta<1>, meta<11>>, f::template eval, types_pack<type_list<> >>;
using tree_to_list = typename for_container<tree1, f::template eval, types_pack<type_list<>> >::first;

debug_type<tree_to_list>;

/* main output:
	<<int, 5>, 
		<<int, -4>, 
			meta_null, 
			<<int, 0>>>, 
		<<int, 43>, 
			<<int, 13>, 
			<<int, 9>>>>>>'

*/

// using m = meta<"test">;

// debug_type<meta<sizeof(__int128_t)>>;


// template <auto... vs>
// struct auto_node {};
// template <auto v, auto... vs>
// struct auto_node<v, vs...> {
// 	using value_t = decltype(v);
// 	using next = auto_node<vs...>;

// 	static constexpr auto value = v;
// };

// template <auto... values>
// struct auto_list {
// 	using types = type_list<decltype(values)...>;
// 	using head = auto_node<values...>;
// };


// // #define meta_string(str) decltype(str##_metas)
// template <typename A, typename B>
// using f = types_pack<typename A::mul<B>, B>;
// using ans = for_n<3, f, types_pack<meta<7>, meta<3>>>;
// debug_type<ans>;
int main() {

	// debug_type<auto_list<1, 'c', -32l, 0x12ul, nullptr>::types>;
	// auto meta_str = R_META_STRING("Hello meta string!");
	// debug_type<decltype(meta_str)>;
	// debug_type<decltype("Hello meta string!"_metas)>;
	// debug_type<meta_string("hello")>;
	// auto meta_str = make_meta_str("Hello meta string!");
	// auto&& tup = list3::to_tuple<>;
	// auto&& tup = list
	// list4 l;
	return 0;
}	

